/**cookie操作工具 
 * @author wanglun
 */
(function($){
	if(!$) return
	var a = Function
	a.prototype.addCookie = function(key,value,expiresHours){   
	    var cookieString=key+"="+escape(value)
	    if(expiresHours>0){  
	        var date=new Date()   
	        date.setTime(date.getTime+expiresHours*3600*1000)  // cookie 设置延迟的时间// 以expiresHours小时为例
	        cookieString=cookieString+"; expires="+date.toGMTString()
	    }  
	    document.cookie=cookieString 
	}
	a.prototype.getCookie = function(name){  
	    var arrCookie=document.cookie.split(';')   
	    for(var i=0;i<arrCookie.length;i++){  
	        var arr=arrCookie[i].split('=') 
	        if(arr[0].replace(' ','')===name){         // 键值对的判断
	            return arr[1]  
	        }  
	    }  
	    return ''//没有则返回空 
	}  
	a.prototype.deleteCookie = function(name){  
	    var date=new Date()  
	    date.setTime(date.getTime()-1000) 
	    document.cookie=name+"=v;expires="+date.toGMTString()
	}  
	
	/***
	 * 发送短信获取校验码按钮倒计时处理
	 */
	/**验证码按钮倒计时*/
	a.prototype.countDown = function(obj,time){
		obj = $(obj)
		obj.prop("disabled",true)
		var nums = time || 120//三分钟有效期
		obj.val(nums+'秒');
		var clock = setInterval(function(){return helpCountDown(obj)}, 1000); //一秒执行一次
		obj.attr('clock',clock)
	}
	
	a.prototype.clearCountDown = function(obj){
		var clock = obj.attr('clock');
	    clearInterval(clock);//清除js定时器
	    obj.prop("disabled",false);
	    obj.val( '验证码');
		$.deleteCookie('codeTime');
		$.deleteCookie('phone');
	}
	/*循环器*/
	function helpCountDown(obj)
	 {	
		if(!obj) return;
 		var nums = Number($.getCookie('codeTime') || 120);
		 nums--;
		 if(nums > 0){
		  	obj.val(nums+'秒')
		  	$.addCookie('codeTime',nums)
		 }else{
		 	  $.clearCountDown(obj);
		 }
	 }
	
	/**
	 * 加载函数
	 */
	/**
	 * 加载函数根基url参数发送post请求
	 * @param url 加载链接
	 * @param json 回调函数
	 * @param callback 回调函数
	 * @return
	 */
	a.prototype.load = function(url,json,callback){
		if(!url || url.isBlank()) return
		if(callback == undefined || callback == null || callback.constructor !== Function) return
		if(!layerUi) return
		var layerIndex = layerUi.load(1, {
			  shade: [0.4,'#fff'] //0.1透明度的白色背景
		})
		if(json){//有json参数
			$.post(url,json,function(res){
					/*关闭遮罩层*/
				layerUi.close(layerIndex)
				callback(res)
			})
		}else{
			$.post(url,function(res){
				/*关闭遮罩层*/
				layerUi.close(layerIndex)
				callback(res)
			})
		}
	}
	
	/**
	 * 只能输入数字
	 * input对象格式检查
	 * 	eg input输入框不让输入特殊字符
	 * @param obj 文本输入框对象
	 * @return void
	 */
	a.prototype.onlyNumber = function(obj){
		if(!obj) return false
		var v = obj.value
		if(v.isBlank()) /*如果为空则替换空字符*/{obj.value = '' ;return false}
		obj.value = v.replace(/\D/g,'')//替换非数字字符
		return true
	}
	
	/**
	 * 只能输入数字、小数
	 * input对象格式检查
	 * 	eg input输入框不让输入特殊字符
	 * @param obj 文本输入框对象
	 * @return void
	 */
	a.prototype.onlyFloat = function(a){
		if(!a) return false
		var b = a.value
		if(b.isBlank()) /*如果为空则替换空字符*/{a.value = '' ;return false}
		a.value = b.replace(/[^0-9.]/g,'')//替换非数字字符
		return true
	}
	
	/**
	 * 只能输入数字英文字母大小写
	 * input对象格式检查
	 * 	eg input输入框不让输入特殊字符
	 * @param obj 文本输入框对象
	 * @return void
	 */
	a.prototype.onlyNumberAndLetter = function(obj){
		if(!obj) return false
		var v = obj.value
		if(v.isBlank())/*如果为空则替换空字符*/{obj.value = '' ;return false}
		obj.value = v.replace(/\W/g,'').replace(/_/,'')//替换非数字字符
		return true
	}
	
	/**
	 * 对jquery扩展 layer-mobile的open函数打开一个窗口
	 * @param options json参数
	 */
	a.prototype.open = function(options){
		//参数必须为json 且layer插件可用
		if(!Util.isJson(options) || !layer) return
		options = $.extend(true,{
			title : options.title || '温馨提示',
			style : '',
			content : '文本内容',
			shadeClose : true,
			yes : function(){
				var index = Number($('div.layui-m-layer').attr('index'))
				layer.close(index)
			},
			no : function(){
				var index = Number($('div.layui-m-layer').attr('index'))
				layer.close(index)
			}
		},options)
		options.title = [options.title,'height: 0.8rem;font-size: .4rem;line-height: .8rem;color: white;letter-spacing: .1rem;background-color: #3babdd;']
		return layer.open({
			title:options.title,
			style: options.style,
			content: options.content,
			shadeClose:options.shadeClose,
			btn:['确定','取消'],
			yes:function(){
				options.yes()
			},
			no:function(){
				options.no()
			}
		})
	}
	
	/**
	 * 对jquery扩展 layer-mobile的open函数打开一个小窗口
	 * 	只提示参数文字 没有按钮及其他样式
	 * @param text
	 */
	a.prototype.msg = function(text){
		if(!layer) return
		var index = layer.open({
    		style: 'width: 85%;font-size: 0.4rem;line-height: 0.6rem;text-align: center;',
    		content: text || '提示信息',
    		shadeClose:false,
    		mousewheel:false,
			anim:true,
    	})
    	//先取消冒泡
    	Util.stopBubble();
    	if(!$) return
    	$('body').on('click touchstart',function(){
	    		if(!layer || index === undefined) return
	    		layer.close(index)
	    		location.reload()
    		}
    	)
    	return index
	}
	
	/***
	 * 对dom对象进行扩展
	 */
	var b = $.fn.constructor/*jquerydom扩展原型*/
	/**
	 * 发送短信获取短信验证码
	 * $(this)即为需要发送短信的dom 
	 * 	eg:<input type="button" value="获取验证码">
	 * @param phoneDom  手机号码的输入框dom 
	 * 	eg:<input type="text" placeholder="请输入手机号码">
	 * @param type 短信类型 表明此处的短信是发送什么类型的验证码
	 * 	1:代理申请 2:授权代理 3:绑定手机
	 * @return
	 */
	b.prototype.sendSms = function(phoneDom,type){
		if(!phoneDom) return false
		//目前参数一只支持input输入框
		if(phoneDom[0].nodeName !== 'INPUT') return false
		var $this=$(this),form = $this.closest("form")
		if(!form) return false
		/*先验证手机号码格式是否正确*/
		var flag = form.validationEngine('validateAppoint',$(phoneDom))
		if(!flag) return false
		var  url=Util.url("/sendSms.do"),json={type:type || 2,mobile:$(phoneDom).val()}
		$.post(url,json,function(res){
			//处理3分钟有效期,按钮三分钟后才可点击
			$.addCookie('phone',$(phoneDom).val())
			$.countDown($this)
		})
	}
	
	/***
	 * 根据touch事件
	 * 判断该对象的滑动方向
	 * @param a 触发了滑动事件的dom对象
	 * @return 静态方向值
	 */
	function FouchDirection(a,ACTION){
		this.constant={
				$DOM:$(arguments[0]),
				DOM:arguments[0],
				DOMERROR:"No DOM",
				JQERROR:"No jQuery"
		};
		if(!this.constant.DOM){
			alert(this.constant.DOMERROR);
			return false;
		}
		if(!$){
			alert(this.constant.JQERROR);
			return false;
		}
		this.constant.$DOM.on("touchstart",
		function(e)
		 {
			e=e||window.event;
			//this.Event.preventDefault();
			$(this).data("STARTX",e.originalEvent.changedTouches[0].pageX);
			$(this).data("STARTY",e.originalEvent.changedTouches[0].pageY);
		}).on("touchend",function(e){
				e=e||window.event;
				var constant={
						LEFT:"left",
						RIGHT:"right",
						UP:"up",
						DOWN:"down",
						STARTX:0,
						STARTY:0,
						ENDX:0,
						ENDY:0,
						MOVEX:0,
						MOVEY:0,
						CLIENGHEIGHT:0,
						OFFSETHEIGHT:0,
						SCROLLTOP:0,
						TOUCHTIPS:"No sliding"
				};
				//this.Event.preventDefault();
				constant.STARTX = Number($(this).data("STARTX"));
				constant.STARTY = Number($(this).data("STARTY"));
				constant.ENDX = e.originalEvent.changedTouches[0].pageX;
				constant.ENDY = e.originalEvent.changedTouches[0].pageY;
				constant.MOVEX= constant.ENDX-constant.STARTX;
				constant.MOVEY= constant.ENDY-constant.STARTY;
			    if( Math.abs(constant.MOVEX) > Math.abs(constant.MOVEY) && constant.MOVEX > 0 ) {
			    	ACTION[constant.LEFT]();
			    	return true;
			    }
			    else if ( Math.abs(constant.MOVEX) > Math.abs(constant.MOVEY) && constant.MOVEX < 0 ) {
			    	ACTION[constant.LEFT]();
			    	return true;
			    }else if ( Math.abs(constant.MOVEY) > Math.abs(constant.MOVEX) && constant.MOVEY > 0) {
			    	ACTION[constant.DOWN]();
			    	return true;
			    }else if ( Math.abs(constant.MOVEY) > Math.abs(constant.MOVEX) && constant.MOVEY < 0 ) {
			    	 //判断滚动条滚动到最底端：scrollTop == (offsetHeight – clientHeight)
			    	constant.OFFSETHEIGHT=$("body")[0].scrollHeight;
			    	constant.CLIENGHEIGHT=$("body").height();
			    	constant.SCROLLTOP=$("body").scrollTop();
			    	//移动到最底端
			    	if(constant.OFFSETHEIGHT-constant.CLIENGHEIGHT<=constant.SCROLLTOP){
			    		ACTION[constant.UP]();
			    		return true;
			    	}
			    }else{
			    	//alert(constant.TOUCHTIPS);
			    	return;
			    }
		});
	}
	
	/**
	 * 对象滑动监听 移动端触发滑动、PC端触发拖拽事件
	 * @param direction 滑动方向 json对象
	 * 	这里会判断设备类型并绑定对应的事件,触发的时候执行对应的操作
	 * @return
	 */
	b.prototype.slide = function(direction){
		if(!Util.isJson(direction)) return
		var $us = Util.browser,/*获取设备信息*/device = $us.mobile || $us.iPad,directionJson={}
		if(device){//移动设备
			direction.hasOwnProperty('left') ? directionJson['left'] = direction['left'] : '';//向左滑动
			direction.hasOwnProperty('right') ? directionJson['right'] = direction['right'] : '';//向右滑动
			direction.hasOwnProperty('up') ? directionJson['up'] = direction['up'] : '';//向上滑动
			direction.hasOwnProperty('down') ? directionJson['down'] = direction['down'] : '';//向下滑动
			directionJson.fingers='all';
			//获取方向
			FouchDirection(this,directionJson);
			//$(this).swipe();舍弃jquery的touch插件
		}else{//非移动设备
			var lastX = null,lastY = null;
			$(this).on({
				mousedown : function(event){
					//按下时记录坐标位置
					var e = event || window.event || arguments[0],
                    lastX= event.clientX,lastY = event.clientY;
				},
				mouseup :  function(event){
					var e = event || window.event || arguments[0]
					var curX = event.clientX,curY = event.clientY
					//鼠标弹回的时候判断类似于拖动的方向
					if(lastX == null || lastY == null){return}
					if((curX - lastX)  >= 360){//向右滑动360px(半屏)执行
	            		direction.hasOwnProperty('right') ? direction['right']() : ''//向右滑动
	            	}else if((lastX-curX) >= 360){//向左360px
	            		direction.hasOwnProperty('left') ? direction['left']() : ''//向左滑动
	            	}
	            	if((curY - lastY) >= 500){//向上
	            		direction.hasOwnProperty('up') ? direction['up']() : ''//向上滑动
	            	}else if((lastY-curY) >= 500){//向下
	            		direction.hasOwnProperty('down') ? direction['down']() : ''//向下滑动
	            	}
				},
				mousewheel : function(event){
					var type = 0;
					var e = event || window.event || arguments[0];
					if(e.wheelDelta){//IE/Opera/Chrome 
				       type = e.wheelDelta; 
				    }else if(e.detail){//Firefox 
				        type = e.detail; 
				    } 
					if(type<0){//向下滚动
						//direction.hasOwnProperty('up') ? direction['up']() : ''//向下滑动
						//alert('向下滚动了鼠标')
					}else{//上滚
						//direction.hasOwnProperty('up') ? direction['up']() : ''//向上滑动
						//alert('向上滚动了鼠标')
					}
				}
            })
		}
		return this
	}
	
	/**
	 * 在对象上方悬浮一个图片
	 * @param imgName 悬浮图片名称
	 * @return 悬浮物id
	 */
	b.prototype.floatObj = function(imgName){
		var mask = document.getElementById('mask'),body=document.getElementsByTagName('body')[0],main=$('div.u_main')
		if(!mask){
			var mask = document.createElement('div')
       		mask.setAttribute("id", "mask")
       		mask.setAttribute("class", "mask_div_big")
            body.appendChild(mask)//遮罩层
		}
		//高度减去悬浮图片的高度
		var target=$(this),offset=target.offset(),top=offset.top-50,left=offset.left,
		floatObj=document.createElement('div')
		top>=parseInt(main.css('height'))/2 ? top = top/2 : '',left>=parseInt(main.css('width'))/2 ? left = left/2 : ''
		floatObj.setAttribute('style','z-index: 1000;position: absolute;left:'+left+'px;top:'+top+
				'px;background:url(/stataic/img/app/workspace/'+imgName+') no-repeat;width:4.51rem;height:1.33rem;background-size: contain;cursor: pointer;')
		floatObj.setAttribute('class','ydxx')
		body.appendChild(floatObj)
		$('#mask').on('click',function(){//绑定点击取消事件
			$('#mask,div.ydxx').remove()//关闭遮罩层
			//完成引导，把第一位数改为1
			var url=requestUrl("/user/flagGuide.shtml"),json={id:getParam('user_id'),type:1}
			$.post(url,json,function(){})//成功不做任何处理
		})
	}
	
	/***
	 * 对对象的内容进行简写
	 * 	eg <a>123456</a> --> <a>...456</a>
	 * 	@PARAM e 简写方式 1右简写 2左简写
	 * 	@param f简写的长度
	 * @return
	 */
	b.prototype.shortWord = function(e,f){
		if(!this) return
		var a=$(this),e=e||2,f=f||3,b,c,d,g=
		{
			"mouseover":function(){
				if(!layerUi) return
				var clazz=$(this),h=layerUi.tips(clazz.data('c'),clazz, {
								  tips: [e == 2 ? 1 : 4, '#3595CC'],
								  time: 5000
				})
			   clazz.data('i',h)
			},
			"mouseout":function(){
				var clazz=$(this)
				clazz.text(clazz.data('d'))
				if(!layerUi) return
				layerUi.close(clazz.data('i'))
			}
		}
		for(var i=0;i<a.length;i++){
			b =$(a[i]),c=b.text().trim()
			if(c.length <= f) continue//只简写长度大于3的字符串
			if(e == 1){
				d=c.substring(0,f)+"..."
			}else if(e == 2){
				d="..."+c.substring(c.length-f)
			}
			b.text(d).on(g).data('c',c).data('d',d)
		}
		return a
	}
	
	//重写jQuery.post方法
    var _post = $.post;  
    $.post = function(){  
    	var url = arguments[0];
    	var param = {};
    	var callback = function(){};//回调函数
		if(arguments.length === 3){//url,json,callback
			param =  arguments[1];
			callback = arguments[2];//function(res){//@TODO}
		}else{
			callback = arguments[1];
		}
		var $callback = function(res){
			//扩展增强处理,处理回调数据不为json对象时做一个转换
			if(typeof res === 'string') res = JSON.parse(res);
			if(res.status !== '0'){//错误提示
				//关闭所有的弹出层
				if(layer&&layerUi){
					layer.closeAll();
					layerUi.closeAll();
					//关闭自定义遮罩层
					var a = $("#mask");
					if(a!=null){
						a.remove();
					}
				}
				if(res.status == '404'){
					//身份信息过期
					location.href=Util.url("/pages/common/mobile_login.html");
				}else{
					blueui.alert(res.msg);
				}
				return;
			}
			callback(res);
		}
        return _post(url,param,$callback);  
    }
    
    /**
     * 过滤函数
     * 针对对象的所有子元素不满足指定条件的全部隐藏掉
     * @param a json参数
     * 	a.type 过滤方式 定义1为div过滤 2为table过滤
     * 	a.filter 过滤条件
     */
    b.prototype.myFilter = function(a){
    	if(!a||!Util.isJson(a)) return;
    	a = $.extend(true,{type:1},a);
    	if(!a.filter || typeof a.filter !== "function") return;
    	var b = $(this),c,d;
    	/*对table布局进行过滤*/
    	if(a.type===1){
    		c = b.children("div");
    		$.each(c,function(){
    			d = $(this);
    			if(a.filter(d)){
    				d.show();
    			}else{
    				d.hide();
    			}
    		});
    	}
    }
    
    /**
     * 排序函数
     * 针对对象的所有子元素进行排序
     * @param a json参数
     * 	a.type 排序方式 定义1为div排序 2为table排序（可对tbody和tr排序）
     * 	a.sort 排序条件
     */
    b.prototype.sort = function(a){
    	if(!a||!Util.isJson(a)) return;
    	a = $.extend(true,{type:1},a);
    	if(!a.sort || typeof a.sort !== "function") return;
    	var b = $(this),c,d=[];
    	/*对table布局进行过滤*/
    	if(a.type===1){
    		c = b.children("div");
    		$.each(c,function(){
    			d.push($(this));
    		});
    		b.append(d.sort(a.sort));
    	}
    }
})(jQuery)